package Server;

import Server.Model.Room;

import java.net.ServerSocket;
import java.util.HashMap;

//** Classe principale du serveur, gère les infos globales **
public class TarotServer
{
    private HashMap<Integer,JoueurThread> hashMapJoueur = new HashMap<Integer, JoueurThread>(); //Enregistre tous les joueurs
    private HashMap<Integer,Room> roomHashMap = new HashMap<Integer, Room>(); //Enregistre chaque room (salle de jeux)
    private int idJoueurMax = 0;
    private int idRoomMax = 0;

    public static void main(String args[])
    {
        //On lance la classe principale du serveur
        TarotServer tarotServer = new TarotServer();
        try {
            Integer port;
            if(args.length<=0) port= 18000; // si pas d'argument : port 18000 par défaut
            else port = Integer.valueOf(args[0]); // sinon il s'agit du numéro de port passé en argument

            ServerSocket serverSocket = new ServerSocket(port); // ouverture d'un socket serveur sur port

            while (true) { // attente en boucle de connexion (bloquant sur serverSocket.accept)
                new JoueurThread(serverSocket.accept(),tarotServer); // un client se connecte, un nouveau thread client est lancé
            }
        } catch (Exception e) { }
    }

    /**
     * Méthode d'envoie d'un message à un joueur
     * @param message message à envoyer sur le flux de sortie
     * @param idJoueur id du joueur
     */
    public void send(String message, int idJoueur)
    {
        this.hashMapJoueur.get(idJoueur).send(message);
    }

    /**
     * Supprime le joueur de la liste
     * @param idJoueur id du joueur
     */
    synchronized public void supprimerJoueur(int idJoueur)
    {
        this.hashMapJoueur.remove(idJoueur);
    }

    /**
     * Ajoute un nouveau joueur dans la liste des joueurs et lui donne un id unique
     * @param joueurThread le joueur
     */
    synchronized public void ajouterJoueur (JoueurThread joueurThread)
    {
        this.idJoueurMax++;
        this.hashMapJoueur.put(idJoueurMax,joueurThread);
        joueurThread.setIdClient(idJoueurMax);
    }

}